import 'package:bluetooth_parse_plugin/src/common/extension_enum.dart';

// 源设备类型
enum LorinSourceDeviceType {
  app(0x02),
  driver(0x21),
  human(0x22);

  final int rawValue;
  const LorinSourceDeviceType(this.rawValue);
  // 通过 rawValue 获取枚举类型
  static LorinSourceDeviceType? getTypeByNum(int rawValue) =>
      LorinSourceDeviceType.values
          .firstWhereOrNull((activity) => activity.rawValue == rawValue);
}

// 数据格式
enum LorinDataFormatType {
  free(0x00), // 自由格式（0）
  norCpp(0x01), // 1主1从
  norTcpp(0x02), // 1主多从
  norStcpp(0x03), // 多主多从
  speCp(0x04), // 1主1从
  speTcp(0x05), // 1主多从
  speStcp(0x6), // 多主多从
  none(0x07); // 预留

  // 响应包中不包含para的长度
  int rspExcludingParaLen() {
    switch (this) {
      case LorinDataFormatType.norCpp:
        return 2;
      case LorinDataFormatType.speCp:
        return 1;
      case LorinDataFormatType.norTcpp:
        return 3;
      case LorinDataFormatType.speTcp:
        return 2;
      case LorinDataFormatType.norStcpp:
        return 4;
      case LorinDataFormatType.speStcp:
        return 3;
      default:
        return 0;
    }
  }

  final int rawValue;
  const LorinDataFormatType(this.rawValue);
  // 通过 rawValue 获取枚举类型
  static LorinDataFormatType? getTypeByNum(int rawValue) =>
      LorinDataFormatType.values
          .firstWhereOrNull((activity) => activity.rawValue == rawValue);
}

// Lorin数据格式
enum LorinDataChannelType {
  link(0), // 用于线路查询，高度安全的连接过程（如动态密码表的同步)
  test(1), // 主要用于与生产测试工具对接
  info(2), // 用于产品通用信息读写，包括产品型号、SN、电池容量等
  control(3), // 用于产品部分通用的控制功能，包括关机/重启/休眠/唤醒/固件升级等
  file(4), // 用于文件下载（包括固件升级）、文件上传以及文件列表的同步
  storage(5), // 用于产品内部存储设备的一般操作，包括读取容量，格式化等，这里的存储设备包括片内片外 FLASH，SD 卡，TF 卡等
  ble(6), // 修改蓝牙名称及密码、获取蓝牙 MAC 等
  wifi(7),
  gps(8),
  net2G_5G(9);

  final int rawValue;
  const LorinDataChannelType(this.rawValue);
  // 通过 rawValue 获取枚举类型
  static LorinDataChannelType? getTypeByNum(int rawValue) =>
      LorinDataChannelType.values
          .firstWhereOrNull((activity) => activity.rawValue == rawValue);
}

// 标准组通道1属性类型
enum LorinDataPropertyType {
  property0(0), 
  property1(1), 
  property2(2),  
  property3(3), 
  property4(4), 
  property5(5), 
  property6(6); 

  final int rawValue;
  const LorinDataPropertyType(this.rawValue);
  // 通过 rawValue 获取枚举类型
  static LorinDataPropertyType? getTypeByNum(int rawValue) =>
      LorinDataPropertyType.values
          .firstWhereOrNull((activity) => activity.rawValue == rawValue);
}
